package Connector;

import java.io.IOException;
import java.io.InputStream;

public class Request {

    private static final int BUFFER_SIZE = 1024;
    // 试试改buffer size的大小，看看会发生什么。

    // socket的输入
    private InputStream input;
    // TODO 什么时候使用inputStream??
        // 所有的文件归根结底都是二进制的，都可以使用字节流；
        // 这里只是一个引用；创建实例的时候用具体的类；


    // 用来存储URI
    private String URI;

    // 构造函数
    // generator的快捷键：alt + insert
    public Request(InputStream input) {
        this.input = input;
    }

    // 从request得到URI
    public String getRequestURI() {
        return URI;
    }

    // 解析request生成URI； 注意：生成URI和返回URI是分开的
    // 不是生成请求行，请求行在input里面；
    public void parse(){
        // length用于将byte[] = char[]拼接为String
        int length = 0;

        byte[] buffer = new byte[BUFFER_SIZE];

        try {
            length = input.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

        // StringBuilder类才能拼接
        StringBuilder request = new StringBuilder();

        for (int i = 0; i < length; i++) {
            request.append((char)buffer[i]);
        }

        // StringBuilder要转换成String再调用parseURI()
        URI = parseURI(request.toString());
        // TODO 不需要对象来调用??
            // 同一个类的一个方法调用另一个方法时，如果被调用方法是普通方法，则默认使用this作为调用者；
            // 如果被调用方法时静态方法，则默认使用类作为调用者。
    }

    private String parseURI(String request){
        int index1, index2 = 0;

        index1 = request.indexOf(' ');
        // 如果出错了会返回-1

        if (index1 != -1) {
            index2 = request.indexOf(' ', index1 + 1);
            // 从哪个位置开始寻找

            if (index2 > index1){   // index2 != -1
                return request.substring(index1 + 1, index2);
            }
        }

        return " ";
    }
}

// 上传gitee